从零开始实现一个C++高性能服务器框架

您所在的位置:网站首页 Tcp server什么意思 从零开始实现一个C++高性能服务器框架

从零开始实现一个C++高性能服务器框架

2024-07-14 02:22| 来源: 网络整理| 查看: 265

此项目是根据sylar框架实现,是从零开始重写sylar,也是对sylar丰富与完善 项目地址:https://gitee.com/lzhiqiang1999/server-framework

简介

项目介绍:实现了一个基于协程的服务器框架,支持多线程、多协程协同调度;支持以异步处理的方式提高服务器性能;封装了网络相关的模块,包括socket、http、servlet等,支持快速搭建HTTP服务器或WebSokcet服务器。 详细内容:日志模块,使用宏实现流式输出,支持同步日志与异步日志、自定义日志格式、日志级别、多日志分离等功能。线程模块,封装pthread相关方法,封装常用的锁包括(信号量,读写锁,自旋锁等)。IO协程调度模块,基于ucontext_t实现非对称协程模型,以线程池的方式实现多线程,多协程协同调度,同时依赖epoll实现了事件监听机制。定时器模块,使用最小堆管理定时器,配合IO协程调度模块可以完成基于协程的定时任务调度。hook模块,将同步的系统调用封装成异步操作(accept, recv, send等),配合IO协程调度能够极大的提升服务器性能。Http模块,封装了sokcet常用方法,支持http协议解析,客户端实现连接池发送请求,服务器端实现servlet模式处理客户端请求,支持单Reator多线程,多Reator多线程模式的服务器。

TcpServer模块

在这里插入图片描述

1. 主要功能 负责Tcp服务端的相关工作,包括监听,处理客户端响应,设置超时时间等和三个IO协程调度器绑定,能够实现监听,处理客户端读写,处理业务逻辑的分离充当监听池,负责所有监听socket的监听工作 2. 功能演示 这一部分的功能需要结合Http通信完成,具体可以参考从零开始实现一个C++高性能服务器框架----Http模块 3. 模块介绍 3.1 TcpServer 基类,包含了Tcp服务端的一些操作,包括监听,处理客户端响应,设置超时时间等 class TcpServer : public std::enable_shared_from_this , Noncopyable { public: typedef std::shared_ptr ptr; /** * @brief 构造函数 * @param[in] worker socket客户端工作的协程调度器 * @param[in] io_woker socket客户端读写的协程调度器 * @param[in] accept_worker 服务器socket执行接收socket连接的协程调度器 */ TcpServer(johnsonli::IOManager* worker = johnsonli::IOManager::GetThis() ,johnsonli::IOManager* io_woker = johnsonli::IOManager::GetThis() ,johnsonli::IOManager* accept_worker = johnsonli::IOManager::GetThis()); virtual ~TcpServer(); virtual bool bind(johnsonli::Address::ptr addr, bool ssl = false); virtual bool bind(const std::vector& addrs ,std::vector& fails ,bool ssl = false); virtual bool start(); virtual void stop(); // get set 方法 protected: virtual void handleClient(Socket::ptr client); // 处理新连接的Socket类,读写,逻辑处理 virtual void startAccept(Socket::ptr sock); // 开始接受连接 private: std::vector m_socks; /// 监听Socket数组 IOManager* m_worker; /// 新连接的Socket工作的调度器 IOManager* m_ioWorker; IOManager* m_acceptWorker; /// 服务器Socket接收连接的调度器 uint64_t m_recvTimeout; /// 接收超时时间(毫秒) std::string m_name; /// 服务器名称 std::string m_type = "tcp"; /// 服务器类型 bool m_isStop; /// 服务是否停止 bool m_ssl = false; }; 当TcpServer完成bind后,就可以调用start()方法,这里m_acceptWorker调度器会专门负责所有监听socket的监听工作 bool TcpServer::start() { if(!m_isStop) { return true; } m_isStop = false; //每个listen socket都需要进行accept for(auto& sock : m_socks) { //专门负责accept的协程调度器 m_acceptWorker->schedule(std::bind(&TcpServer::startAccept, shared_from_this(), sock)); } return true; } 负责监听的函数startAccept。当accept监听到连接请求时(hook的accept),会为连接socket设置超时时长(未在规定时间内发送请求,就会断开这个连接),m_ioWorker调度器负责连接socket的读写。 void TcpServer::startAccept(Socket::ptr sock) { while(!m_isStop) { LOG_INFO(g_logger) setRecvTimeout(m_recvTimeout); //专门处理client socket的协程调度器 //LOG_INFO(g_logger) schedule(std::bind(&TcpServer::handleClient, shared_from_this(), client)); } else { LOG_ERROR(g_logger)


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3